package edu.math.chaos.api;

/**
 * Комплексное число.
 *
 * User: ilya
 * Date: 15.11.13
 * Time: 18:29
 */
public class ComplexNumber {

    private double realPart;
    private double imaginaryPart;

    /**
     * @param realPart Вещественная часть.
     * @param imaginaryPart Мнимая часть.
     */
    public ComplexNumber(double realPart, double imaginaryPart) {
        this.realPart = realPart;
        this.imaginaryPart = imaginaryPart;
    }

    /**
     * @return Вещественная часть.
     */
    public double getRealPart() {
        return realPart;
    }

    /**
     * @param realPart Вещественная часть.
     */
    public void setRealPart(double realPart) {
        this.realPart = realPart;
    }

    /**
     * @return Мнимая часть.
     */
    public double getImaginaryPart() {
        return imaginaryPart;
    }

    /**
     * @param imaginaryPart Мнимая часть.
     */
    public void setImaginaryPart(double imaginaryPart) {
        this.imaginaryPart = imaginaryPart;
    }

    /**
     * @return Модуль числа.
     */
    public double getAbsoluteValue() {
        return Math.sqrt(realPart * realPart + imaginaryPart * imaginaryPart);
    }

    /**
     * Сложение текущего числа с переданным.
     * Резуьтат записывается во вновь созданный объект.
     *
     * @param complexNumber Второй операнд для сложения.
     * @return Результат сложения.
     */
    public ComplexNumber plus(ComplexNumber complexNumber) {
        if (complexNumber == null) {
            return null;
        }

        return new ComplexNumber(realPart + complexNumber.realPart, imaginaryPart + complexNumber.imaginaryPart);
    }

    /**
     * Умножает текущее число на минус единицу.
     * Результат записывается во вновь созданный объект.
     *
     * @return Текущее число, умноженное на минус единицу.
     */
    public ComplexNumber getNegative() {
        return new ComplexNumber(- realPart, - imaginaryPart);
    }

    /**
     * Умножает текущее число на переданное.
     * Результат записывается во вновь созданный объект.
     *
     * @param complexNumber Второй опреанд для умножения.
     * @return Результат уножения.
     */
    public ComplexNumber multiply(ComplexNumber complexNumber) {
        if (complexNumber == null) {
            return null;
        }

        return new ComplexNumber(
            realPart * complexNumber.realPart - imaginaryPart * complexNumber.imaginaryPart,
            realPart * complexNumber.imaginaryPart + imaginaryPart * complexNumber.realPart
        );
    }

    public ComplexNumber copy() {
        return new ComplexNumber(realPart, imaginaryPart);
    }
}
